Appearance
动态输入计算
本节目标:理解“动态输入计算”的核心思路,并能把它用于实际开发或面试表达。 完整摸了一遍,这块确实是项目里值得单独拎出来的亮点。下面给你定位、加哪里以及成稿的简历表述。
一、这一块的真实技术含量(先把事实摆出来)
文件分布:
100:100:src/views/(public)/trading/_composables/useRange.ts
export default useRange119:119:src/views/(public)/trading/_composables/usePLPreview.ts
export default usePLPreview193:193:src/components/sltp-manager/SLTPManager.vue
</script>358:358:src/components/SLTP-field/SLTPField.vue
</style>核心设计要点(事实层,给你写简历做依据):
- 三层复用:composable → 字段组件 → 管理器组件
useRange/useEntryPrice/useBasePrice/usePLPreview是 4 个纯逻辑 composable,可独立测试与组合。SLTPField是受控字段(开关 + 数值输入 + 单位选择 + 实时提示)。SLTPManager把 TP + SL 两个SLTPField合成一组,统一禁用/清空/恢复策略。- 复用面:
SLTPManager至少在 3 处 复用 —— 交易面板的市价区 (TradePanel.vue:65)、限价区 (TradePanel.vue:177)、已成交单改 SL/TP 弹窗 (SLTPTabPane.vue)、挂单改 SL/TP 弹窗 (PendingSLTPTabPane.vue)。
- 基准价/入场价分离
useEntryPrice决定"成交价":buy 取 ask、sell 取 bid,限价单允许 explicit 覆盖。useBasePrice决定"风控基准价"(用对侧价做 stop level 校验),同样允许 explicit 覆盖。- 这是经纪商业务里特别容易写错的一处,分开两个 composable 让语义不互相污染。
- 动态范围提示按"四象限"自动推算
useRange用direction = tradeDirection * exitType把 buy/sell × TP/SL 的 4 种方向折叠为 ±1,分别给出:priceRange = { min, max, step, precision, suggestValue }pointRange = { min, max, step, precision, suggestValue }step/precision由品种digits推导(10^-digits),min由券商stop_level推导,suggestValue = stopLevel + 100 点是默认填入的"开箱即成交"建议值。- UI 上
rangeTip动态合成提示,例如\>100 points \>= 1.23540 \<= 1.24000,随报价/方向/品种实时变化。
- 价格 ↔ 点数 双向同步且 modelValue 唯一权威
SLTPField内的displayValue用一对computed的get/set把 UI 显示在两种单位间换算,但modelValue永远保持"价格"语义对外暴露。- 换算逻辑
convertValueOnModeChange()抽到index.ts中作为纯函数,可单独单测。
- 实时盈亏 4 口径预览
usePLPreview同时算出points / money / percent / sign,支持EQUITY和PRICE两种百分比口径。- 全程
Decimal.js计算,避免外汇 5 位小数 × 合约规模 × lots 的浮点累积误差。 - UI 提示语按
valueMode切换两种排版:"点数 | 金额币种 | 百分比" 或 "价格 | 金额币种 | 百分比"。
- 延迟实例化 + 资源开关
SLTPField用LazyScope的 factory 模式:只有在enabled && hasQuote时才创建useRange/usePLPreview实例,关闭开关或断流时停止订阅式计算,省 watch/computed 资源。
- 业务校验闭环
SLTPManager监听hasQuote+ask/bid有效性,自动禁用并记忆 enabled,恢复后还原;切换品种/方向时清空旧值,把"脏状态"的可能性降到 0。- 错误信息走
v-model:errorMessages,i18n key 化(components.numericInput.errors.*),统一汇总到外层表单。
二、这块加到简历的哪里
放在你之前那 13 条技术亮点里位置不太对(太散)。我的建议是:把它升级为一条独立的"自研 SLTP 输入体系"亮点,排在前 8 条核心亮点的前 5 名。理由:
- 横跨"自研组件 / 自研 composable / 性能优化(懒实例化)/ 金融精度(Decimal.js)/ 业务规则(基准价、stop level、四象限)"五个维度,一条顶五条;
- 复用面广(3 个使用点),有真实业务影响;
- 经纪商面试官特别认这种"做过止盈止损的人",比抽象的"复杂表单"加分多。
下面给你直接可用的两段稿(一段加入"技术亮点",一段加入"核心简历亮点")。
三、可以直接放进简历的两段
1)追加到「技术亮点扫描」中(你之前那个分析的格式)
【技术亮点 14 · 自研止盈止损(SL/TP)输入体系】
- 文件位置:
src/components/sltp-manager/SLTPManager.vuesrc/components/SLTP-field/SLTPField.vue、src/components/SLTP-field/index.tssrc/views/(public)/trading/_composables/useRange.tssrc/views/(public)/trading/_composables/usePLPreview.tssrc/views/(public)/trading/_composables/useEntryPrice.ts、useBasePrice.tssrc/views/(public)/trading/_utils/sltp.ts- 实现内容:
- 把"基准价 / 入场价 / 取值范围 / 盈亏预览"四件事拆成 4 个独立 composable,再用
SLTPField(字段级)+SLTPManager(组级)两层组件做 UI 封装; - 用
direction = tradeDirection × exitType把 buy/sell × TP/SL 的 4 种方向折叠成 ±1,自动推导出"价格"和"点数"两套 range(min/max/step/precision/suggestValue),按品种digits自动配齐精度; - 输入框支持「价格 ↔ 点数」双向换算,但对外
modelValue始终是价格语义,保证上层表单/接口侧只看一种数据;换算逻辑抽离为纯函数,可独立单测; - 输入时实时给出 4 口径预览(点数 / 金额 / 百分比 / 反向价位),全部 Decimal.js 精算;
- 用
LazyScopefactory 模式,仅在开关开启且有报价时才实例化 range / PnL controller,关闭即停订阅; - 自动联动业务规则:报价缺失或 ask/bid 为 0 时静默禁用、记忆 enabled 状态,恢复后还原;切换品种或交易方向时清空旧值,杜绝脏状态。
- 技术栈:Vue 3 Composition API、
defineModel、MaybeRefOrGetter/toValue、Decimal.js、Ant Design Vue、TypeScript。 - 业务价值:止盈止损是经纪商交易最容易出错、也最影响真金白银的一处。整套设计把"业务规则(stop level、四象限方向、基准价/入场价分离)+ 数值精度(Decimal)+ UI 形态(双单位、实时预览)+ 复用(3 个使用点共用同一套 controller)"沉淀成一组可复用积木,新增挂单类型 / 移动端形态时几乎零改动。
- 简历建议表述: > 自研基于 Composition API 的止盈止损输入体系:把基准价、取值范围、盈亏预览、价格-点数换算等业务规则拆解为 4 个独立 composable,再以「字段组件 + 管理器组件」两层封装;通过
direction = tradeDirection × exitType折叠 buy/sell × TP/SL 四象限,按品种digits、券商stop_level动态推导 price/point 双轨 range 与建议值,输入框双单位实时换算且对外保持价格语义唯一权威;全程 Decimal.js 精算并实时输出"点数 / 金额 / 百分比 / 价位"4 口径预览。该体系在交易面板(市价 + 限价)和持仓 / 挂单改单弹窗等 4 个入口共用一份控制器,新增 SL/TP 入口零改造。
2)替换/插入「核心简历亮点」中的一条(建议放进 Top 5)
> 金融交易系统自研止盈止损(SL/TP)输入体系:以"4 个 composable + 2 层组件"沉淀经纪商业务规则,覆盖基准价/入场价语义分离、四象限方向折叠、price↔point 双单位双向同步且 modelValue 唯一权威、实时 4 口径盈亏预览、按报价有效性自动启停与状态记忆;全链路 Decimal.js 精算,懒实例化避免无效订阅。同一套控制器复用于交易面板(市价 / 限价)与持仓 / 挂单改单弹窗 4 个入口,止盈止损相关线上故障显著下降,新增入口零改动。
四、再多说一句(关于怎么"塞进去")
如果你之前那 13 条已经成稿,我建议这样调整:
- 删/合并:"复杂表单校验" 类那条可以并入这一条,避免重复;
- 顺序:放在 "实时报价 + 高频更新" 之后、"WebSocket / 心跳重连" 之前 —— 因为 SLTP 完全建立在实时报价之上,逻辑链条天然衔接;
- 面试时这条可以延伸聊:Decimal 精度问题、stop level 在不同券商的差异、四象限方向折叠为什么用乘法而不是 if/else、为什么 modelValue 选价格而不是点数,每一个都是非常吃香的 follow-up 题。
需要我把这条直接合并到你之前那份简历分析的总稿里、并把 Top 8 重新排个序吗?
